]> dgit.raspbian.org Git - gnome-shell.git/commitdiff
AppWell: If an application is running, activate an existing window
authorColin Walters <walters@verbum.org>
Sat, 4 Jul 2009 21:13:13 +0000 (17:13 -0400)
committerColin Walters <walters@verbum.org>
Mon, 6 Jul 2009 17:43:19 +0000 (13:43 -0400)
Instead of relaunching, pick the first window and activate

js/ui/appDisplay.js
src/shell-app-monitor.c
src/shell-app-monitor.h

index 0fbad13c002da61e1e059d52bde018fe8b4a34f7..372c3649ce927956c4a21c7d1239937a293c7320 100644 (file)
@@ -467,8 +467,7 @@ WellDisplayItem.prototype = {
             }));
         this.actor._delegate = this;
         this.actor.connect('button-release-event', Lang.bind(this, function (b, e) {
-            this.launch();
-            this.emit('activated');
+            this._handleActivate();
         }));
 
         let draggable = DND.makeDraggable(this.actor);
@@ -480,7 +479,7 @@ WellDisplayItem.prototype = {
 
         this.actor.append(iconBox, Big.BoxPackFlags.NONE);
 
-        let count = Shell.AppMonitor.get_default().get_window_count(appInfo.appId);
+        this._windows = Shell.AppMonitor.get_default().get_windows_for_app(appInfo.appId)
 
         let nameBox = new Big.Box({ orientation: Big.BoxOrientation.VERTICAL,
                                     x_align: Big.BoxAlignment.CENTER });
@@ -492,7 +491,7 @@ WellDisplayItem.prototype = {
                                         line_wrap_mode: Pango.WrapMode.WORD_CHAR,
                                         text: appInfo.name });
         nameBox.append(this._name, Big.BoxPackFlags.EXPAND);
-        if (count > 0) {
+        if (this._windows.length > 0) {
             let runningBox = new Big.Box({ /* border_color: GenericDisplay.ITEM_DISPLAY_NAME_COLOR,
                                            border: 1,
                                            padding: 1 */ });
@@ -503,6 +502,16 @@ WellDisplayItem.prototype = {
         }
     },
 
+    _handleActivate: function () {
+        if (this._windows.length == 0)
+            this.launch();
+        else {
+            let first = this._windows[0];
+            first.activate(Clutter.get_current_event_time());
+        }
+        this.emit('activated');
+    },
+
     // Opens an application represented by this display item.
     launch : function() {
         this.appInfo.launch();
index f09961023f186ee7a6c4037024aeb40401a21ab5..7a021d962b9cf29bd07450ef44d7e4fa90e25245 100644 (file)
@@ -377,11 +377,34 @@ load_initial_windows (ShellAppMonitor *monitor)
     }
 }
 
-guint
-shell_app_monitor_get_window_count (ShellAppMonitor *self,
-                                    const char      *appid)
+/**
+ * shell_app_monitor_get_windows_for_app:
+ * @self:
+ * @appid: Find windows for this id
+ *
+ * Returns: (transfer container) (element-type MetaWindow): List of #MetaWindow corresponding to appid
+ */
+GSList *
+shell_app_monitor_get_windows_for_app (ShellAppMonitor *self,
+                                       const char      *appid)
 {
-  return GPOINTER_TO_UINT (g_hash_table_lookup (self->running_appids, appid));
+  GHashTableIter iter;
+  gpointer key, value;
+  GSList *ret = NULL;
+
+  g_hash_table_iter_init (&iter, self->window_to_appid);
+
+  while (g_hash_table_iter_next (&iter, &key, &value))
+    {
+      MetaWindow *window = key;
+      const char *id = value;
+
+      if (strcmp (id, appid) != 0)
+        continue;
+
+      ret = g_slist_prepend (ret, window);
+    }
+  return ret;
 }
 
 static void
index 073691b1d7b503feb237616787d32af90f9f3d6b..7ed68d05b4030ce743cb48c896b782b1e506fe76 100644 (file)
@@ -44,7 +44,7 @@ GSList *shell_app_monitor_get_most_used_apps (ShellAppMonitor *monitor,
                                               int              activity,
                                               gint             number);
 
-guint shell_app_monitor_get_window_count (ShellAppMonitor *monitor, const char *appid);
+GSList *shell_app_monitor_get_windows_for_app (ShellAppMonitor *monitor, const char *appid);
 
 /* Get whatever's running right now */
 GList *shell_app_monitor_get_running_app_ids (ShellAppMonitor *monitor);